parser grammar xmlParser;

options {
  language = Java;
  tokenVocab = xmlLexer;
  ASTLabelType = MiArbol;
  output = AST;
  backtrack = true;
}

tokens {
  INST_XML;
}

@header {
  package PL.practica10;
}


//entrada : etiqueta -> ^(INST_XML etiqueta);
//
//etiqueta :  etiqueta_apertura^ contenido* etiqueta_cierre
//         ;
//etiqueta_apertura :  ABRIR_ANGULO! ID CERRAR_ANGULO!
//                  ;
//etiqueta_cierre : ANGULO_SLASH! ID CERRAR_ANGULO!
//                ;

//contenido : TEXTO
//          | etiqueta
//          ;
//          
        
entrada : etiquetabiblio -> ^(INST_XML etiquetabiblio); 
          
etiquetabiblio : biblioini^  etiquetalib+  bibliofin
               ;
etiquetalib : libini^ etiquetatit etiquetaaut etiquetaedit libfin
            ;
etiquetatit : titini^ TEXTO titfin
            ;
etiquetaaut : autini^ TEXTO autfin
            ;
etiquetaedit : editini^ TEXTO editfin
             ;

biblioini:  ABRIR_ANGULO!  BIBLIO atributo? CERRAR_ANGULO!
         ;
bibliofin: ANGULO_SLASH! BIBLIO!  CERRAR_ANGULO!
         ;
libini: ABRIR_ANGULO! LIB^  atributo?  CERRAR_ANGULO!
      ;
libfin: ANGULO_SLASH! LIB!  CERRAR_ANGULO!
      ;
titini: ABRIR_ANGULO! TIT^ atributo? CERRAR_ANGULO!
      ;
titfin: ANGULO_SLASH! TIT!  CERRAR_ANGULO!
      ;
autini: ABRIR_ANGULO! AUT^ atributo?  CERRAR_ANGULO!
      ;
autfin: ANGULO_SLASH! AUT!  CERRAR_ANGULO!
      ;
editini: ABRIR_ANGULO! EDIT^ atributo?  CERRAR_ANGULO!
       ;
editfin: ANGULO_SLASH! EDIT! CERRAR_ANGULO!
       ;

 atributo : ID IGUAL CADENA;
